﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FP_Tree;

namespace FP_Tree
{
    public class Controladora
    {
        private int epsilon;
        private FPTree tree;
        /*
         * formato:
         * <numero de transacciones>
         * I1,I2,I3...IN
         * 
         * ejemplo:
         * 5
         * a,b,c,d,e,f,g,h,i,j
         * a,b,c
         * d,e,f
         * g,h,i
         * j,a,b
         * c,d,e
         * 
         * */
        public void importarInformacion(String ruta = "datos.txt", double soporte = 0.2)
        {

            tree = new FPTree();
            SortedSet<Item> dic = new SortedSet<Item>(new comparadorPorOcurrencia());
            //INICIO PRIMERA LECTURA
            StreamReader lector = new StreamReader(ruta);
            //String linea = lector.ReadLine();
            //epsilon = Convert.ToInt16(linea);
            //lector.ReadLine();
            //int numItems = Convert.ToInt16(lector.ReadLine());
            int numTransacciones = Convert.ToInt16(lector.ReadLine());
            this.epsilon = (int)(soporte * numTransacciones);
            //lector.ReadLine();

            //nuevo
            Dictionary<String, int> dictionary = new Dictionary<String, int>();
            for (int i = 0; i < numTransacciones; i++)
            {

                //String iteraccionActual = lector.ReadLine();
                //if (iteraccionActual.Split(',').Length >= porcentaje)
                //{

                String[] itemsLector = lector.ReadLine().Split(',');

                for (int j = 0; j < itemsLector.Length; j++)
                {
                    if (dictionary.ContainsKey(itemsLector[j]))
                    {
                        dictionary[itemsLector[j]] = dictionary[itemsLector[j]] + 1;
                    }
                    else
                    {
                        dictionary.Add(itemsLector[j], 1);
                    }
                    //Esto es O(n) un diccionario lo mejora
                    /*string key = itemsLector[j];
                    int value = 1;
                        
                    //find toma O(N)
                    Item itemEncontrado = items.Find(x => x.Key.Equals(key));

                    if (itemEncontrado == null)
                    {
                        items.Add(new Item(key, value));
                    }
                    else
                    {
                        value = itemEncontrado.Value + 1;
                        items.Remove(itemEncontrado);
                        items.Add(new Item(key, value));
                    }
                     * */
                    // }

                }
            }
            lector.Close();
            //FIN PRIMERA LECTURA
            foreach (KeyValuePair<string, int> entry in dictionary)
            {
                if (entry.Value > epsilon)
                {
                    dic.Add(new Item(entry.Key, entry.Value));
                }
            }
            //Borra el diccionario
            dictionary = null;
            //INICIO SEGUNDA LECTURA
            lector = new StreamReader(ruta);
            lector.ReadLine();
            //lector.ReadLine();
            //lector.ReadLine();
            //lector.ReadLine();
            for (int i = 0; i < numTransacciones; i++)
            {
                String[] itemsLector = lector.ReadLine().Split(',');
                List<string> t = new List<string>();
                //TODO esto se puede mejorar
                foreach (Item ii in dic)
                {
                    if (itemsLector.Contains(ii.Key))
                    {
                        t.Add(ii.Key);
                    }
                }
                //FIN TODO
                tree.addTransaction(t);
            }
            lector.Close();
        }

        //public FPTree podar(String item, FPTree original)
        //{
        //    FPTree resultado = new FPTree();
        //    for (FPNode nodo = original.primerNodo(item); item != null; nodo = nodo.Siguiente)
        //    {
        //        colgarRama(nodo.Padre, nodo.Conteo, resultado);
        //    }
        //    return resultado;
        //}

        //public FPNode colgarRama(FPNode nodo, int cuenta, FPTree resultado)
        //{
        //    if (nodo == null)
        //    {
        //        return nodo;
        //    }
        //    FPNode padre = colgarRama(nodo.Padre, cuenta, resultado);

        //    return resultado.addNodo(padre, nodo.Contenido, cuenta);//(padre, nodo.id, nodo.Contenido, cuenta);
        //}

        public void buscarPatrones(String patron, int soporte_minimo, FPTree arbol, List<String> patrones){
	      foreach(var item in tree.HeadersTable){
		        if(item.Value.Soporte>soporte_minimo){
                    patrones.Add(patron + " " + item.Value.Contenido + " " + item.Value.Soporte);
                    buscarPatrones(patron + " " + item, soporte_minimo, arbol.podar(item.Value.Contenido, arbol), patrones);
		}
	}	
}

    }
}
